#include "../inc/ulist.h"

// Ulist 构造函数，初始化列表
Ulist::Ulist(UI_Object* parent)
{
  // 设置父对象
  this->parent = parent;

  // 创建一个 LVGL 对象作为列表容器
  this_object = lv_obj_create(parent->get_lv_obj_t());

  // 禁用滚动功能
  lv_obj_clear_flag(this_object, LV_OBJ_FLAG_SCROLLABLE);

  // 设置 Flex 布局为垂直方向
  lv_obj_set_flex_flow(this_object, LV_FLEX_FLOW_COLUMN);

  // 设置 Flex 布局的对齐方式为居中
  lv_obj_set_flex_align(this_object, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);

  // 设置列表的背景颜色为主题定义的绿色
  lv_obj_set_style_bg_color(this_object, lv_color_hex(THEME_COLOR_GREEN), LV_PART_MAIN | LV_STATE_DEFAULT);

  // 设置背景不透明度为完全不透明
  lv_obj_set_style_bg_opa(this_object, 255, LV_PART_MAIN | LV_STATE_DEFAULT);

  // 设置列表的尺寸
  lv_obj_set_size(this_object, this->width, this->height);

  // 将列表居中显示
  lv_obj_center(this_object);

  // lv_obj_add_event_cb(this_object, [](lv_event_t* e) {
  //   Ulist* self = (Ulist*) e->user_data;
  //   if (e->code == LV_EVENT_CLICKED)
  //   {
  //     printf("clicked\n");
  //     // if (self->on_click_cb != NULL)
  //     // {
  //     //   self->on_click_cb(e);
  //     // }
  //   }

  //   }, LV_EVENT_CLICKED, this);

  // 打印构造函数日志
  printf("UI:ulist constructor\n");
}

// Ulist 析构函数
Ulist::~Ulist()
{
  // 析构函数内容为空
}

// 添加一个带图标和文本的按钮到列表中
void Ulist::add_btn(const void* icon, const char* txt)
{
  // 创建一个带图标和文本的按钮
  lv_obj_t* btn = lv_list_add_btn(this_object, icon, txt);

  // 设置按钮的宽度为列表的宽度
  lv_obj_set_width(btn, this->width);

  // 添加按钮的点击事件回调
  lv_obj_add_event_cb(btn, [](lv_event_t* e) {
    // 获取用户数据（即 Ulist 对象的指针）
    Ulist* self = (Ulist*) e->user_data;

    // 检查事件类型是否为点击事件
    if (e->code == LV_EVENT_CLICKED)
    {
      // printf("clicked\n");


      lv_obj_t* obj = lv_event_get_target(e);
      // if (code == LV_EVENT_CLICKED) {
      // LV_UNUSED(obj);
      // LV_LOG_USER("Clicked: %s", lv_list_get_btn_text(self->get_lv_obj_t(), obj));
      // }

      // printf("Clicked: %s\n", lv_list_get_btn_text(self->get_lv_obj_t(), obj));

      // 如果点击事件回调函数已设置，则调用回调函数
      if (self->on_click_cb != NULL)
      {
        self->on_click_cb(e);
      }
    }
  }, LV_EVENT_CLICKED, this);  // 监听 LV_EVENT_CLICKED 事件，并将 this 作为用户数据传递
}

// 添加一个纯文本项到列表中
void Ulist::add_text(const char* txt)
{
  // 创建一个纯文本项
  lv_list_add_text(this_object, txt);
}

// 设置列表项的点击事件回调函数
void Ulist::on_click(on_click_cb_t cb)
{
  // 设置点击事件回调函数
  this->on_click_cb = cb;
}

// 设置列表的尺寸
void Ulist::set_size(lv_coord_t width, lv_coord_t height)
{
  // 更新列表的宽度和高度
  this->width = width;
  this->height = height;

  // 设置列表的尺寸
  lv_obj_set_size(this_object, this->width, this->height);
}